﻿/*
  --============================================================================================
  --============================================================================================
  -- Fichier          :	CompositionChimique
  -- Objet			  :	Classe métier reprenant les données de détails d'un PV avec le code instruction DC01
  -- Auteur			  :	S. Le Gouellec
  -- Date de création : 07/2014
  --                              :
  --                              :
  -- Notes spéciales		  :
  -- Historique			  :
  ----------------------------------------------------------------------------------------------
  -- |     Code    |  Vers. |   Date   | Auteur	|                  Description
  -- |  Dem/inc/pr |  	    |          |        |         
  -- -------------------------------------------------------------------------------------------
  -- |             |   1.0  | 07/2014  |  SLE	| Création
  -- |	           |	    |	       |        |
  --============================================================================================
  --============================================================================================
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ModelEntities.CompositionChimique
{
    /// <summary>
    /// Classe métier reprenant les données des lignes détails des compositions chimiques du PV
    /// </summary>
    public class CompositionChimique : INotifyPropertyChanged,
                                             IBuilt 
                                            
    {
        #region Attribut(s)

        #region Attributs DC

        private String dc1;
        private String dc2;
        private String dc3;
        private String dc4;
        private String dc5;
        private String dc6;
        private String dc7;
        private String dc8;
        private String dc9;
        private String dc10;
        private String dc11;
        private String dc12;
        private String dc13;
        private String dc14;
        private String dc15;
        private String dc16;
        private String dc17;
        private String dc18;
        private String dc19;

        #endregion

        private readonly int[] tailleChamp = new int[19] { 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

        #endregion

        #region Propriété(s)

        #region DCs

        public String DC1
        {
            get { return dc1; }
            set { dc1 = value; OnPropertyChanged("DC1"); }
        }

        public String DC2
        {
            get { return dc2; }
            set { dc2 = value; OnPropertyChanged("DC2"); }
        }

        public String DC3
        {
            get { return dc3; }
            set { dc3 = value; OnPropertyChanged("DC3"); }
        }

        public String DC4
        {
            get { return dc4; }
            set { dc4 = value; OnPropertyChanged("DC4"); }
        }

        public String DC5
        {
            get { return dc5; }
            set { dc5 = value; OnPropertyChanged("DC5"); }
        }

        public String DC6
        {
            get { return dc6; }
            set { dc6 = value; OnPropertyChanged("DC6"); }
        }

        public String DC7
        {
            get { return dc7; }
            set { dc7 = value; OnPropertyChanged("DC7"); }
        }

        public String DC8
        {
            get { return dc8; }
            set { dc8 = value; OnPropertyChanged("DC8"); }
        }

        public String DC9
        {
            get { return dc9; }
            set { dc9 = value; OnPropertyChanged("DC9"); }
        }

        public String DC10
        {
            get { return dc10; }
            set { dc10 = value; OnPropertyChanged("DC10"); }
        }

        public String DC11
        {
            get { return dc11; }
            set { dc11 = value; OnPropertyChanged("DC11"); }
        }

        public String DC12
        {
            get { return dc12; }
            set { dc12 = value; OnPropertyChanged("DC12"); }
        }

        public String DC13
        {
            get { return dc13; }
            set { dc13 = value; OnPropertyChanged("DC13"); }
        }

        public String DC14
        {
            get { return dc14; }
            set { dc14 = value; OnPropertyChanged("DC14"); }
        }

        public String DC15
        {
            get { return dc15; }
            set { dc15 = value; OnPropertyChanged("DC15"); }
        }

        public String DC16
        {
            get { return dc16; }
            set { dc16 = value; OnPropertyChanged("DC16"); }
        }

        public String DC17
        {
            get { return dc17; }
            set { dc17 = value; OnPropertyChanged("DC17"); }
        }

        public String DC18
        {
            get { return dc18; }
            set { dc18 = value; OnPropertyChanged("DC18"); }
        }

        public String DC19
        {
            get { return dc19; }
            set { dc19 = value; OnPropertyChanged("DC19"); }
        }

        #endregion

        public Int32 NoPage
        {
            get;
            set;
        }

        #endregion

        #region Constructeur(s)

        public CompositionChimique(Int32 noPage)
        {
            NoPage = noPage;
            Init();
        }

        private void Init()
        {
            this.DC1 = String.Empty;
            this.DC2 = String.Empty;
            this.DC3 = String.Empty;
            this.DC4 = String.Empty;
            this.DC5 = String.Empty;
            this.DC6 = String.Empty;
            this.DC7 = String.Empty;
            this.DC8 = String.Empty;
            this.DC9 = String.Empty;
            this.DC10 = String.Empty;
            this.DC11 = String.Empty;
            this.DC12 = String.Empty;
            this.DC13 = String.Empty;
            this.DC14 = String.Empty;
            this.DC15 = String.Empty;
            this.DC16 = String.Empty;
            this.DC17 = String.Empty;
            this.DC18 = String.Empty;
            this.DC19 = String.Empty;
        }

        #endregion

        #region Méthode(s)

        /// <summary>
        /// Permet de completer l'attribut avec des espaces à la fin si celui ci n'et pas égale à length.
        /// Si attribute.Length > length, la chaine retourné est tronquée
        /// </summary>
        /// <param name="attribute">Attribut à compléter</param>
        /// <param name="length">Longueur souhaité de l'attribut transformé</param>
        /// <returns>Retourne le résultat de l'opération de transformation</returns>
        private String CompleteWithSpace(String attribute, int length)
        {
            if (attribute.Length > length)
                return attribute.Substring(0, length);
            else
                return attribute.PadRight(length, ' ');
        }

        #endregion

        #region Implements INotifyPropertyChanged

        /** Permet de notifier les élements grapghiques qui sont bindés dessus, en cas de modification **/
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(String info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }

        #endregion

        #region Implements IBuilt

        /// <summary>
        /// Permet de charger une liste d'objet dans cette instance
        /// </summary>
        /// <param name="listObjects">Liste d'objet à charger</param>
        public void Objects(List<object> listObjects)
        {
            int ind = 0;

            this.DC1 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC2 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC3 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC4 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC5 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC6 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC7 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC8 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC9 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC10 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC11 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC12 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC13 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC14 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC15 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC16 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC17 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC18 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DC19 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
        }

        /// <summary>
        /// Permet de reconstitué la ligne formatté des compositions chimiques pour pouvoir être mise à jour en BDD
        /// </summary>
        /// <returns>Retourne un objet de type String correctement formatté</returns>
        public object TransformBack()
        {
            StringBuilder build = new StringBuilder();
            build.Append(CompleteWithSpace(this.DC1, tailleChamp[0])).Append(";");
            build.Append(CompleteWithSpace(this.DC2, tailleChamp[1])).Append(";");
            build.Append(CompleteWithSpace(this.DC3, tailleChamp[2])).Append(";");
            build.Append(CompleteWithSpace(this.DC4, tailleChamp[3])).Append(";");
            build.Append(CompleteWithSpace(this.DC5, tailleChamp[4])).Append(";");
            build.Append(CompleteWithSpace(this.DC6, tailleChamp[5])).Append(";");
            build.Append(CompleteWithSpace(this.DC7, tailleChamp[6])).Append(";");
            build.Append(CompleteWithSpace(this.DC8, tailleChamp[7])).Append(";");
            build.Append(CompleteWithSpace(this.DC9, tailleChamp[8])).Append(";");
            build.Append(CompleteWithSpace(this.DC10, tailleChamp[9])).Append(";");
            build.Append(CompleteWithSpace(this.DC11, tailleChamp[10])).Append(";");
            build.Append(CompleteWithSpace(this.DC12, tailleChamp[11])).Append(";");
            build.Append(CompleteWithSpace(this.DC13, tailleChamp[12])).Append(";");
            build.Append(CompleteWithSpace(this.DC14, tailleChamp[13])).Append(";");
            build.Append(CompleteWithSpace(this.DC15, tailleChamp[14])).Append(";");
            build.Append(CompleteWithSpace(this.DC16, tailleChamp[15])).Append(";");
            build.Append(CompleteWithSpace(this.DC17, tailleChamp[16])).Append(";");
            build.Append(CompleteWithSpace(this.DC18, tailleChamp[17])).Append(";");
            build.Append(CompleteWithSpace(this.DC19, tailleChamp[18])).Append(";");
            build.Append(";");

            return build.ToString();
        }

        /// <summary>
        /// Permet de vérifier le bon format des données saisies par l'utilisateur
        /// </summary>
        /// <returns></returns>
        public String VerifyDataEntry()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(this.DC1.Length <= tailleChamp[0] ? String.Empty : String.Format("La cellule N°1 ne doit pas dépasser {0} caractères\n", tailleChamp[0]));
            sb.Append(this.DC2.Length <= tailleChamp[1] ? String.Empty : String.Format("La cellule N°2 ne doit pas dépasser {0} caractères\n", tailleChamp[1]));
            sb.Append(this.DC3.Length <= tailleChamp[2] ? String.Empty : String.Format("La cellule N°3 ne doit pas dépasser {0} caractères\n", tailleChamp[2]));
            sb.Append(this.DC4.Length <= tailleChamp[3] ? String.Empty : String.Format("La cellule N°4 ne doit pas dépasser {0} caractères\n", tailleChamp[3]));
            sb.Append(this.DC5.Length <= tailleChamp[4] ? String.Empty : String.Format("La cellule N°5 ne doit pas dépasser {0} caractères\n", tailleChamp[4]));
            sb.Append(this.DC6.Length <= tailleChamp[5] ? String.Empty : String.Format("La cellule N°6 ne doit pas dépasser {0} caractères\n", tailleChamp[5]));
            sb.Append(this.DC7.Length <= tailleChamp[6] ? String.Empty : String.Format("La cellule N°7 ne doit pas dépasser {0} caractères\n", tailleChamp[6]));
            sb.Append(this.DC8.Length <= tailleChamp[7] ? String.Empty : String.Format("La cellule N°8 ne doit pas dépasser {0} caractères\n", tailleChamp[7]));
            sb.Append(this.DC9.Length <= tailleChamp[8] ? String.Empty : String.Format("La cellule N°9 ne doit pas dépasser {0} caractères\n", tailleChamp[8]));
            sb.Append(this.DC10.Length <= tailleChamp[9] ? String.Empty : String.Format("La cellule N°10 ne doit pas dépasser {0} caractères\n", tailleChamp[9]));
            sb.Append(this.DC11.Length <= tailleChamp[10] ? String.Empty : String.Format("La cellule N°11 ne doit pas dépasser {0} caractères\n", tailleChamp[10]));
            sb.Append(this.DC12.Length <= tailleChamp[11] ? String.Empty : String.Format("La cellule N°12 ne doit pas dépasser {0} caractères\n", tailleChamp[11]));
            sb.Append(this.DC13.Length <= tailleChamp[12] ? String.Empty : String.Format("La cellule N°13 ne doit pas dépasser {0} caractères\n", tailleChamp[12]));
            sb.Append(this.DC14.Length <= tailleChamp[13] ? String.Empty : String.Format("La cellule N°14 ne doit pas dépasser {0} caractères\n", tailleChamp[13]));
            sb.Append(this.DC15.Length <= tailleChamp[14] ? String.Empty : String.Format("La cellule N°15 ne doit pas dépasser {0} caractères\n", tailleChamp[14]));
            sb.Append(this.DC16.Length <= tailleChamp[15] ? String.Empty : String.Format("La cellule N°16 ne doit pas dépasser {0} caractères\n", tailleChamp[15]));
            sb.Append(this.DC17.Length <= tailleChamp[16] ? String.Empty : String.Format("La cellule N°17 ne doit pas dépasser {0} caractères\n", tailleChamp[16]));
            sb.Append(this.DC18.Length <= tailleChamp[17] ? String.Empty : String.Format("La cellule N°18 ne doit pas dépasser {0} caractères\n", tailleChamp[17]));
            sb.Append(this.DC19.Length <= tailleChamp[18] ? String.Empty : String.Format("La cellule N°19 ne doit pas dépasser {0} caractères\n", tailleChamp[18]));

            return sb.ToString();
        }

        #endregion
    }
}